// 用户路由表

// 加载模块
let express = require('express');
let fs = require('fs');
let jwt = require('jsonwebtoken');
let sendMail = require('../utils/email.js');
let usersModel = require('../db/models/usersModel.js');

// 创建路由表(空表)
let router = express.Router();

// 向路由表添加内容:

// 验证是否已登录接口
router.get('/islogin',(req,res)=>{
    // 获取token
    let token = req.headers.authorization;
    jwt.verify(token,'abc123',(err,payload)=>{
        if (err) {
            res.send({"code":0,"msg":"用户未登录","userData":[]});
        } else {
            res.send({"code":1,"msg":"用户已登录","userData":[payload.username,payload.nickname,payload.email]});
        }
    })
})

// 登录接口
// 接口地址：http://localhost:9999/users/login
// 请求方式：post
// 请求参数：username账号  password密码
// 返回值：{"code":1,"msg":"登录成功"}
router.post('/login',(req,res)=>{
    // 获取参数
    let {username,password} = req.body;

    // console.log( '参数：'+username,password );

    // 查询users数据集合
    usersModel.find({$and:[{username},{password}]})
    .then(
        (arr)=>{
            if (arr.length > 0) {
                // 生成一个token
                let info = {// 当前登录的用户信息
                    email: arr[0].email,
                    username: arr[0].username,
                    nickname: arr[0].nickname
                }
                let token = jwt.sign(info,'abc123',{expiresIn:60*30});

                // 登录成功，响应请求
                res.send({"code":1,"msg":"登录成功","userData":[arr[0].email,arr[0].username,arr[0].nickname,arr[0].sex,arr[0].age],"token":token});

                // 重定向
                // res.redirect('https://www.baidu.com/');
            } else {
                // 登录失败，响应请求
                res.send({"code":0,"msg":"账号或密码错误"});
            }
        },
        (err)=>{
            // 登录失败，响应请求
            res.send({"code":-1,"msg":err});
        }
    )
});

// 缓存验证码
let cacheCode = {
    // '2239222721@qq.com': '626990',
    // '123456789@qq.com': '675355',
    // ...
}

// 注册接口
router.post('/register',(req,res)=>{
    // 获取参数
    let {username,password,nickname,email,age,sex,code} = req.body;

    // 校验注册验证码
    if (code !== cacheCode[email]) {
        return res.send({"code":-9999,"msg":"验证码错误"});
    }

    // 校验数据
    let reg1 = /^\w{6,16}$/;
    if (!reg1.test(username)) {
        return res.send({"code":-1,"msg":"账号格式错误"});
    }
    let reg2 = /^\w{6,16}$/;
    if (!reg2.test(password)) {
        return res.send({"code":-2,"msg":"密码格式错误"});
    }
    let reg3 = /^.{2,10}$/;
    if (!reg3.test(nickname)) {
        return res.send({"code":-3,"msg":"昵称格式错误"});
    }
    let reg4 = /^\w{6,20}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/;
    if (!reg4.test(email)) {
        return res.send({"code":-4,"msg":"邮箱格式错误"});
    }
    let reg5 = /^\d{1,3}$/;
    if (!reg5.test(age)) {
        return res.send({"code":-5,"msg":"年龄格式错误"});
    }
    let reg6 = /^[男女妖]$/;
    if (!reg6.test(sex)) {
        return res.send({"code":-6,"msg":"性别格式错误"});
    }
    let reg7 = /^\d{4,8}$/;
    if (!reg7.test(code)) {
        return res.send({"code":-7,"msg":"验证码格式错误"});
    }

    // 查询username是否已注册
    usersModel.find({username})// p1
    .then(
        (arr)=>{
            if (arr.length > 0) {
                // 该账户已注册，不添加数据，响应请求
                res.send({"code":-8,"msg":"账号已存在"});
                // 终止链式调用
                return new Promise(()=>{});
            }
            else {
                // 该账户未注册，可以添加数据
                return usersModel.insertMany({username,password,nickname,email,age,sex});
            }
        },
        (err)=>{
            // 出错了，响应请求
            res.send({"code":-9,"msg":err});
        }
    )// p2
    .then(
        (arr)=>{
            if (arr.length > 0) {
                // 注册成功
                res.send({"code":1,"msg":"注册成功"});
            } else {
                // 注册失败
                res.send({"code":0,"msg":"注册失败"});
            }
        },
        (err)=>{
            res.send({"code":-9,"msg":err});
        }
    )

    // res.send('register is ok');
});

// 发送邮箱验证码
router.post('/sendmail',(req,res)=>{
    // 获取参数
    let {email} = req.body;

    // 生成随机验证码
    let code = parseInt(Math.random()*1000000)+'';

    // 发送邮件
    sendMail(email,'注册验证码',code)
    .then(
        ()=>{
            // 缓存验证码
            cacheCode[email] = code;

            // 响应请求
            res.send({"code":1,"msg":"邮件发送成功"});
        },
        ()=>{
            // 响应请求
            res.send({"code":0,"msg":"邮件发送失败"});
        }
    )
})


// 获取用户列表接口
router.get('/getusers',(req,res)=>{
    // 查询数据库
    usersModel.find()
    .then((arr)=>{
        res.send({"code":1,"msg":"获取成功","data":arr});
    })
    .catch((err)=>{
        res.send({"code":0,"msg":"获取失败","data":[]});
    })
})

// 导出路由表
module.exports = router;
